"""
    IO操作
    r：读     r+：读写
    w：写     w+：读写
    a：写     a+：读写(追加)
    b: 二进制文件操作
    OS文件夹操作
    文件复制功能
    迭代器
    列表推导式
        [表达式 for 变量 in 列表]
        [表达式 for 变量 in 列表 if 条件]  [name.upper()for name in names if len(name)>3]
    生成器
"""
import os
from datetime import datetime
from collections.abc import Iterable, Iterator
#file = open("../source/a.txt")
#file.name
#print(file.readline())
#current_dir = os.path.dirname(os.path.abspath(__file__))
#source_dir = os.path.join(os.path.dirname(current_dir), 'source')
#file_path = os.path.join(source_dir, 'a.txt')
file_path = "../source/a.txt"  #. 表示当前目录
print("file_path:",  file_path)
lastNum = 0
"""
with open(file_path, "r" , encoding='utf-8') as file:
    # print(file.read()) 读取全部内容
    print(type(file))  # >>> <class '_io.TextIOWrapper'>
    print(file.name)
    while True:
        line = file.readline()
        if not line:
            break
        print(line.strip())
        lastNum += 1
"""

now = datetime.now()
#追加内容
with open(file_path, "a+" , encoding='utf-8') as file:
    file.write("\n" + now.strftime("%Y-%m-%d %H:%M:%S       这是程序追加内容"))
    while True:
        line = file.readline()
        if not line:
            break
        print(line.strip())
    print("当前文件指针位置" , file.tell())
    file.seek(0)
    print("初始化")
    print("当前文件指针位置" , file.tell())
    while True:
        line = file.readline()
        if not line:
            break
        print(line.strip())

#文件复制功能
with open("../source/IMG_20240925_203144.jpg", "rb") as file:
    file_bytes = file.read()
    with open("../source/IMG_20240925_203144副本.jpg", "wb") as file_copy:  #覆盖写
        file_copy.write(file_bytes)

"""
    OS文件相关操作
    os.rename(source, target) 命名
    os.remove(source) 删除
    os.getcwd() 获取当前目录
    
    OS文件夹相关操作
    os.path.exists(path) 函数可以用来判断指定路径的文件或目录是否存在
    os.path.isdir(full_path)：判断给定路径是否为一个目录。
    os.mkdir 创建一个文件夹
"""
if not os.path.exists("../source/tmp"):
    os.mkdir("../source/tmp")

print(os.getcwd())  #E:\py\PythonProject\syntax

dir_list = os.listdir("../source")
print(dir_list)  # >>> ['a.txt', 'IMG_20240925_203144.jpg', 'IMG_20240925_203144副本.jpg', 'tmp']

"""
    可迭代对象Iterable
    #isinstance obj , A_tuple  (类或者元组类)
    
    迭代器对象Iterator
    
"""
print(isinstance(123, int))   # >>> True
print(isinstance(123, Iterable))  # >>> False
print(isinstance("123", Iterable)) # >>> True
#判断是否是可迭代对象
ite = iter(["a", "b", "c"])
print(next(ite))  # a
print(next(ite))  # b
print(next(ite))  # C

for item in iter(["a", "b", "c"]):
    print(item, end= " ") # a b c



# 自定义可迭代器
class Counter:
    def __init__(self, limit):
        self.limit = limit
        self.current = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.limit:
            self.current += 1
            return self.current
        else:
            raise StopIteration("数据迭代完毕")  # 这个异常会被程序自动捕获 异常信息输出到控制台

# 使用 Counter 迭代器
counter = Counter(5)
for num in counter:
    print(num)

"""
    列表推导式 yield(翻译：避让的意思 )
    简单来说，yield 可以被翻译为“产生”或者“让出”，它的主要作用是暂时将控制权交还给调用者，同时保存函数的状态（包括局部变量和指令指针的位置），以便下一次调用时能够从中断的地方继续执行。
    生成器
"""
list = [i*2 for i in range(10)]
generator_s = (i*2 for i in range(10))
print(list)  # >>>  [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
print(generator_s) # >>> <generator object <genexpr> at 0x0000019E6ED1A9B0>
print(isinstance(list, Iterable)) # >>> True
print(isinstance(list, Iterator)) # >>> False
print(isinstance(generator_s, Iterable))   # >>> True
print(isinstance(generator_s, Iterator))   # >>> True
for num in generator_s:
    print(num, end=" ") # >>> 0 2 4 6 8 10 12 14 16 18

print()

def my_generator():
    yield 1
    yield 2
    yield 3

# 创建生成器对象
gen = my_generator()

# 使用生成器对象
for item in gen:
    print(item)


def number_generator():
    print("Starting generator")
    for i in range(1, 4):
        print(f"Yielding {i}")
        yield i
    print("Generator finished")

# 使用生成器
gen = number_generator()
gen01 = number_generator()
print(gen01 == gen) # >>> False
#print(next(gen))
#print(next(gen))
#print(next(gen))
#print(next(gen))
for num in gen:
    print(num)

"""
    1：可迭代对象
    2：迭代器
    3：生成器 (特殊的迭代器)
    三者关系 可迭代对象 > 迭代器 > 生成器
    
"""